﻿#region Using

using System;
using Vk.Methods.Common;
using Vk.Methods.Photos;

#endregion

namespace Vk.Methods.Video
{
    /// <summary>
    ///     Видеозапись
    /// </summary>
    public class Video : BaseEntity
    {
        /// <summary>
        ///     Может ли текущий пользователь оставлять комментарии к ролику
        /// </summary>
        public bool? CanComment { get; set; }

        /// <summary>
        ///     Может ли текущий пользователь скопировать ролик с помощью функции «Рассказать друзьям»
        /// </summary>
        public bool? CanRepost { get; set; }

        /// <summary>
        ///     Количество комментариев к видеозаписи
        /// </summary>
        public int? Comments { get; set; }

        /// <summary>
        ///     Дата добавления видеозаписи
        /// </summary>
        public DateTime? Date { get; set; }

        /// <summary>
        ///     Описание
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        ///     Длительность ролика в секундах
        /// </summary>
        public TimeSpan Duration { get; set; }

        /// <summary>
        ///     Информация от отметках «Мне нравится»
        /// </summary>
        public LikesInfo Likes { get; set; }

        /// <summary>
        ///     url изображения-обложки ролика с размером 130x98px
        /// </summary>
        public string Photo130 { get; set; }

        /// <summary>
        ///     url изображения-обложки ролика с размером 320x240px
        /// </summary>
        public string Photo320 { get; set; }

        /// <summary>
        ///     url изображения-обложки ролика с размером 640x480px
        /// </summary>
        public string Photo640 { get; set; }

        /// <summary>
        ///     Адрес страницы с плеером, который можно использовать для воспроизведения ролика в браузере. Поддерживается flash и
        ///     html5, плеер всегда масштабируется по размеру окна.
        /// </summary>
        public string PlayerLink { get; set; }

        /// <summary>
        ///     Настройки приватности комментирования
        /// </summary>
        public Privacy PrivacyComment { get; set; }

        /// <summary>
        ///     Настройки приватности просмотров
        /// </summary>
        public Privacy PrivacyView { get; set; }

        /// <summary>
        ///     Зацикливание воспроизведения видеозаписи
        /// </summary>
        public bool? Repeat { get; set; }

        /// <summary>
        ///     Заголовок
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        ///     Количество просмотров видеозаписи
        /// </summary>
        public int? Views { get; set; }

        public Video(ApiNode node)
        {
            Id = node.Int("id");
            OwnerId = node.Int("owner_id");
            Title = node.String("title");
            Description = node.String("description");

            var duration = node.Int("duration");
            if (duration.HasValue)
            {
                Duration = TimeSpan.FromSeconds(duration.Value);
            }

            Photo130 = node.String("photo_130");
            Photo320 = node.String("photo_320");
            Photo640 = node.String("photo_640");
            Date = node.DateTime("date");
            AddingDate = node.DateTime("adding_date");
            PlayerLink = node.String("player");
            Comments = node.Int("comments");
            Views = node.Int("views");
            AccessKey = node.String("access_key");
            Processing = node.Bool("processing");
            Live = node.Bool("live");

            PrivacyView = node.Object("privacy_view", apiNode => new Privacy(apiNode));
            PrivacyComment = node.Object("privacy_comment", apiNode => new Privacy(apiNode));

            CanComment = node.Bool("can_comment");
            CanRepost = node.Bool("can_repost");
            Repeat = node.Bool("repeat");

            Likes = node.Object("likes", apiNode => new LikesInfo(apiNode));
        }

        /// <summary>
        /// Поле возвращается в том случае, если видеозапись является прямой трансляцией, всегда содержит true. Обратите внимание, в этом случае в поле duration содержится значение 0. 
        /// </summary>
        public bool? Live { get; set; }

        /// <summary>
        /// Поле возвращается в том случае, если видеоролик находится в процессе обработки, всегда содержит true.
        /// </summary>
        public bool? Processing { get; set; }

        /// <summary>
        /// Ключ доступа к объекту.
        /// </summary>
        public string AccessKey { get; set; }

        /// <summary>
        /// Дата добавления видеозаписи пользователем или группой.
        /// </summary>
        public DateTime? AddingDate { get; set; }
    }
}